import json
from datetime import datetime

from django.core.paginator import Paginator
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View

from menu.models import SysRoleMenu
from role.models import SysRole, SysRoleSerializer, SysUserRole


# 每个接口对应前端的一个操作（如点击删除按钮、提交表单等）


# 返回所有角色数据（不分页）
class ListAllView(View):
    def get(self, request):
        # 从数据库获取所有角色，转成字典列表
        obj_roleList = SysRole.objects.all().values()
        roleList = list(obj_roleList)  # 转为Python列表
        return JsonResponse(
            {'code': 200, 'roleList': roleList})  # 返回JSON响应（角色列表,不分页）


# 根据关键词搜索角色，返回分页结果
class SearchView(View):
    def post(self, request):
        # 解析请求数据：页码、每页大小、搜索关键词
        data = json.loads(request.body.decode("utf-8"))
        pageNum = data['pageNum']  # 当前页
        pageSize = data['pageSize']  # 每页大小
        query = data['query']  # 查询参数
        # print(pageSize, pageNum,query)

        # 模糊查询角色名，分页处理
        roleListPage = Paginator(SysRole.objects.filter(name__icontains=query),
                                 pageSize).page(pageNum)

        # 获取当前页数据,转为字典，再转为列表
        roles = list(roleListPage.object_list.values())

        total = SysRole.objects.filter(name__icontains=query).count()  # 总数
        return JsonResponse(
            {'code': 200, 'roleList': roles, 'total': total})


# 新增或修改角色信息（根据ID是否为-1判断
class SaveView(View):
    def post(self, request):
        data = json.loads(request.body.decode("utf-8"))

        if data['id'] == -1:  # 新增
            # 创建新角色对象，设置创建时间
            obj_sysRole = SysRole(name=data['name'],
                                  code=data['code'],
                                  remark=data['remark'])
            obj_sysRole.create_time = datetime.now().date()
            obj_sysRole.save()
        else:  # 修改
            # 根据ID更新角色信息，设置更新时间
            obj_sysRole = SysRole(id=data['id'],
                                  name=data['name'],
                                  code=data['code'],
                                  remark=data['remark'],
                                  create_time=data['create_time'],
                                  update_time=data['update_time'])
            obj_sysRole.update_time = datetime.now().date()
            obj_sysRole.save()
        return JsonResponse({'code': 200})


# 查看角色详情或批量删除角色（级联删除关联数据）
class ActionView(View):
    # 根据ID获取单个角色信息
    def get(self, request):
        id = request.GET.get("id")
        role_object = SysRole.objects.get(id=id)
        # 序列化角色数据并返回
        return JsonResponse({'code': 200,
                             'role': SysRoleSerializer(role_object).data})

    # 批量删除角色及相关权限
    def delete(self, request):
        # 要删除的ID列表
        idList = json.loads(request.body.decode("utf-8"))
        # 删除用户角色关联、角色菜单关联、角色本身
        SysUserRole.objects.filter(role_id__in=idList).delete()
        SysRoleMenu.objects.filter(role_id__in=idList).delete()
        SysRole.objects.filter(id__in=idList).delete()
        return JsonResponse({'code': 200})


# 返回角色拥有的菜单权限ID列表
class MenusView(View):
    def get(self, request):
        id = request.GET.get("id")  # 角色ID

        # 查询该角色关联的所有菜单ID
        menuList = SysRoleMenu.objects.filter(role_id=id).values("menu_id")
        # 提取菜单ID列表（例如 [1, 2, 3]）
        menuIdList = [m['menu_id'] for m in menuList]
        # print("menuIdList=", menuIdList)
        return JsonResponse({'code': 200, 'menuIdList': menuIdList})


# 角更新角色拥有的菜单权限（先清空旧权限，再添加新权限）
class GrantMenu(View):
    def post(self, request):
        data = json.loads(request.body.decode("utf-8"))

        role_id = data['id']  # 角色ID
        menuIdList = data['menuIds']  # 要授权的菜单ID列表
        # print(role_id, menuIdList)

        # 删除角色菜单关联表中的指定角色数据
        SysRoleMenu.objects.filter(role_id=role_id).delete()
        # 添加新权限
        for menuId in menuIdList:
            roleMenu = SysRoleMenu(role_id=role_id, menu_id=menuId)
            roleMenu.save()
        return JsonResponse({'code': 200})
